package top.yxqz.sprinmvc.restful.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import top.yxqz.sprinmvc.restful.dao.EmployeeDao;
import top.yxqz.sprinmvc.restful.pojo.Employee;

import java.util.Collection;

/**
 * @author: 余小小
 * @date: 2023/5/9
 * @description：
 */
@Controller
@RequestMapping("/emp")
public class EmpController {
    @Autowired
    private EmployeeDao service;

    /**
     * 跳转到员工信息列表页面
     * uri:  /emp/
     */
    @GetMapping("/")
    public String getALlEmps(Model model) {
//        查询员工所有数据
        Collection<Employee> emps = service.getAll();
//        丢到域对象中
        model.addAttribute("employees", emps);
        return "emp_list";
    }

    /**
     * 跳转到添加员工页面
     * Uri:  /emp/add
     */
    @GetMapping("/add")
    public String goAddEmp() {
        return "addemployee";
    }
    /**
     * 实现添加功能（post)
     * 1.拿到前端数据:建议前端的name属性和对象的字段名字保持高度一致
     *  a.通过单个字面量 ，通过request对象调用getParameter
     *  b.通过注解，@RequestParam
     *  c.通过路由参数（rest）
     *  d.通过对象直接获取
     *  e.通过map
     * 2.实现添加
     * 3.添加成功跳转到列表页面
     * uri：/emp/add
     */
    @PostMapping("/add")
    public String  doAddEmp(Employee emp){
        service.save(emp);
//        跳转到列表页面
        return "redirect:/emp/";
    }


    /**
     * 修改：在此处的修改页面和添加页面一模一样
     * 1.拿到修改的那一行的数据——————表单回显
     * 2.跳转到修改页面
     * uri: /emp/update/{id}
     */
    @GetMapping("/update/{empId}")
    public String  goUpdateEmp(@PathVariable("empId") Integer id,Model model){
//        通过id得到该对象(需要操作的对象）
        Employee employee = service.get(id);
//        将操作对象丢到请求域中
        model.addAttribute("target_employee",employee);
        return "updateemployee";
    }
    /**
     * 执行修改操作put请求
     * 1.获取修改后的对象信息
     * 2.执行修改
     * 3.刷新数据——————跳转到列表页面
     * uri: /emp/update/
     *
     * form表单提交，只支持get和post，想发送其他特殊请求，就只能使用HiddenHttpMethodFilter来实现
     * 使用就只能使用HiddenHttpMethodFilter的时候需要注意：
     * 1.form的提交方式，必须设置为post
     * 2.发送特殊请求的时候，需要自己配置一个input标签，并将该标签的name属性设置为_method，value属性设置为put（或者其他）
     * 3.为了不影响布局，需要input标签的type属性设置为hidden
     * 在修改的时候，为了保证修改数据的完整性 ，建议将id或者其他相关字段信息进行传递
     *
     */
    @PutMapping("/update/")
    public String  doUpdateEmp(Employee emp){
        service.save(emp);
        return "redirect:/emp/";
    }

    /**
     * 实现删除功能（delete）
     * 1.需要删除的条件——————id
     * 2.执行删除
     */
    @DeleteMapping("/delete/{empId}")
    public String  doDelEmp(@PathVariable("empId") Integer id){
        service.delete(id);
        return "redirect:/emp/";
    }
}
